package com.hdu.service;


import com.hdu.dto.QueryMediaParamsDto;
import com.hdu.dto.UploadFileParamsDto;
import com.hdu.entity.MediaFiles;
import com.hdu.pojo.PageBean;
import com.hdu.pojo.Result;
import com.hdu.vo.UploadFileResultVo;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

public interface IMediaFileService {

    /**
     * @param queryMediaParamsDto 查询条件
     * @return PageResult<MediaFiles>
     */
    PageBean<MediaFiles> queryMediaFiles(Long companyId, QueryMediaParamsDto queryMediaParamsDto);


    /**
     * @param upload     文件信息
     * @param folder     桶下边的子目录
     * @param objectName 对象名称
     * @param tag        对象名称
     * @return UploadFileResultVo
     */
    UploadFileResultVo uploadFile(MultipartFile upload, String folder, String objectName, String tag) throws IOException;

    /**
     * 将文件信息添加到文件表
     *
     * @param companyId           机构id
     * @param uploadFileParamsDto 上传文件的信息
     * @param objectName          对象名称
     * @param fileMD5             文件md5码
     * @param tag                 文件标签
     * @param bucket              桶
     */
    MediaFiles addMediaFilesToDB(Long companyId, UploadFileParamsDto uploadFileParamsDto, String objectName, String fileMD5, String bucket, String tag);

    /**
     * 检查文件是否存在
     *
     * @param fileMd5 文件的md5
     * @return Result<Boolean>
     */
    Result<Boolean> checkFile(String fileMd5);

    /**
     * 检查分块是否存在
     *
     * @param fileMd5    文件的MD5
     * @param chunkIndex 分块序号
     * @return Result<Boolean>
     */
    Result<Boolean> checkChunk(String fileMd5, int chunkIndex);

    /**
     * 上传分块
     *
     * @param fileMd5 文件MD5
     * @param chunk   分块序号
     * @param bytes   文件字节
     * @return Result<?>
     */
    Result<?> uploadChunk(String fileMd5, int chunk, byte[] bytes);

    /**
     * 合并分块
     *
     * @param companyId           机构id
     * @param fileMd5             文件MD5
     * @param chunkTotal          分块数量
     * @param uploadFileParamsDto 文件信息
     * @return Result<?>
     */
    Result<?> mergeChunks(Long companyId, String fileMd5, int chunkTotal, UploadFileParamsDto uploadFileParamsDto) throws IOException;

    MediaFiles getFileById(String mediaId);

    /**
     * 从minio下载文件
     *
     * @param file       下载后的文件
     * @param bucket     minio中的桶
     * @param objectName minio中的对象名称
     * @return File
     */
    File downloadFileFromMinio(File file, String bucket, String objectName);

    /**
     * 将本地文件上传到MinIO
     *
     * @param filePath   本地文件路径
     * @param bucket     上传到的桶
     * @param objectName 上传到的objectName
     */
    void addMediaFilesToMinIO(String filePath, String bucket, String objectName);

    /**
     * 根据文件md5，生成在minio中的文件路径
     *
     * @param fileMd5   文件md5
     * @param extension 文件后缀名
     * @return String
     */
    String getFilePathByMd5(String fileMd5, String extension);
}
